当前位置:  开发笔记 > 编程语言 > 正文

如何跳过`foreach`循环的迭代?

如何解决《如何跳过`foreach`循环的迭代?》经验,为你挑选了7个好方法。

在Perl中,我可以使用next;命令跳过foreach(或任何循环)迭代.

有没有办法跳过迭代并跳转到C#中的下一个循环?

 foreach (int number in numbers)
 {
     if (number < 0)
     {
         // What goes here to skip over the loop?
     }

     // otherwise process number
 }

John Feminel.. 630

你要:

foreach (int number in numbers) //   <--- go back to here --------+
{                               //                                |
    if (number < 0)             //                                |
    {                           //                                |
        continue;   // Skip the remainder of this iteration. -----+
    }

    // do work
}

以下是continue关键字的更多信息.


更新:回应Brian在评论中的后续问题:

你能否进一步澄清如果我嵌套for循环我会做什么,并想跳过其中一个扩展的迭代?

for (int[] numbers in numberarrays) {
  for (int number in numbers) { // What to do if I want to
                                // jump the (numbers/numberarrays)?
  }
}

A continue始终适用于最近的封闭范围,因此您无法使用它来突破最外层循环.如果出现这样的情况,你需要做一些更复杂的事情,具体取决于你想要的东西,比如break内循环,然后continue是外循环.有关break关键字的文档,请参见此处.在breakC#的关键字是类似于Perl的last关键字.

另外,考虑将Dustin的建议过滤掉您不想事先处理的值:

foreach (var basket in baskets.Where(b => b.IsOpen())) {
  foreach (var fruit in basket.Where(f => f.IsTasty())) {
    cuteAnimal.Eat(fruit); // Om nom nom. You don't need to break/continue
                           // since all the fruits that reach this point are
                           // in available baskets and tasty.
  }
}


Dustin Campb.. 53

另一种方法是在循环执行之前使用LINQ进行过滤:

foreach ( int number in numbers.Where(n => n >= 0) )
{
    // process number
}

这只是更整洁还是实际上更快,因为没有更少的预告?我猜测LINQ已经大大优化了但是LINQ部分必须在某个时刻预测,所以理论上如果数据集很大并且得到的'过滤'子集几乎一样大,那么这将会更慢,因为foreach必须发生两次?那么也许它取决于预期的结果子数据集? (3认同)

+1.虽然这不是对这个问题的直接回应,但在实践中我可能更喜欢这个解决方案而不是我提出的解决方案.使用LINQ似乎是一个很好的通用用例,用于过滤掉您不想处理的循环值. (2认同)


crashmstr.. 24

您还可以翻转if测试:

foreach ( int number in numbers )
{
     if ( number >= 0 )
     {
        //process number
     }
 }

请不要使用更多ifs :( (4认同)

一个基于LINQ的答案很好,并且具有优雅,但使用if语句并没有错. (4认同)


Tamas Czineg.. 17

foreach ( int number in numbers )
{
    if ( number < 0 )
    {
        continue;
    }

    //otherwise process number
}


Edmund Covin.. 16

使用linq的另一种方法是:

foreach ( int number in numbers.Skip(1))
{   
    // process number  
}

如果你想跳过许多项目中的第一项.

或者.SkipWhere如果要指定跳过条件,请使用.



1> John Feminel..:

你要:

foreach (int number in numbers) //   <--- go back to here --------+
{                               //                                |
    if (number < 0)             //                                |
    {                           //                                |
        continue;   // Skip the remainder of this iteration. -----+
    }

    // do work
}

以下是continue关键字的更多信息.


更新:回应Brian在评论中的后续问题:

你能否进一步澄清如果我嵌套for循环我会做什么,并想跳过其中一个扩展的迭代?

for (int[] numbers in numberarrays) {
  for (int number in numbers) { // What to do if I want to
                                // jump the (numbers/numberarrays)?
  }
}

A continue始终适用于最近的封闭范围,因此您无法使用它来突破最外层循环.如果出现这样的情况,你需要做一些更复杂的事情,具体取决于你想要的东西,比如break内循环,然后continue是外循环.有关break关键字的文档,请参见此处.在breakC#的关键字是类似于Perl的last关键字.

另外,考虑将Dustin的建议过滤掉您不想事先处理的值:

foreach (var basket in baskets.Where(b => b.IsOpen())) {
  foreach (var fruit in basket.Where(f => f.IsTasty())) {
    cuteAnimal.Eat(fruit); // Om nom nom. You don't need to break/continue
                           // since all the fruits that reach this point are
                           // in available baskets and tasty.
  }
}



2> Dustin Campb..:

另一种方法是在循环执行之前使用LINQ进行过滤:

foreach ( int number in numbers.Where(n => n >= 0) )
{
    // process number
}


这只是更整洁还是实际上更快,因为没有更少的预告?我猜测LINQ已经大大优化了但是LINQ部分必须在某个时刻预测,所以理论上如果数据集很大并且得到的'过滤'子集几乎一样大,那么这将会更慢,因为foreach必须发生两次?那么也许它取决于预期的结果子数据集?
+1.虽然这不是对这个问题的直接回应,但在实践中我可能更喜欢这个解决方案而不是我提出的解决方案.使用LINQ似乎是一个很好的通用用例,用于过滤掉您不想处理的循环值.

3> crashmstr..:

您还可以翻转if测试:

foreach ( int number in numbers )
{
     if ( number >= 0 )
     {
        //process number
     }
 }


请不要使用更多ifs :(
一个基于LINQ的答案很好,并且具有优雅,但使用if语句并没有错.

4> Tamas Czineg..:
foreach ( int number in numbers )
{
    if ( number < 0 )
    {
        continue;
    }

    //otherwise process number
}



5> Edmund Covin..:

使用linq的另一种方法是:

foreach ( int number in numbers.Skip(1))
{   
    // process number  
}

如果你想跳过许多项目中的第一项.

或者.SkipWhere如果要指定跳过条件,请使用.



6> Kev..:

您可以使用该continue声明.

例如:

foreach(int number in numbers)
{
    if(number < 0)
    {
        continue;
    }
}



7> drewh..:

使用continue语句:

foreach(object number in mycollection) {
     if( number < 0 ) {
         continue;
     }
  }


不明白为什么它被投票,这是错的,因为他循环"o",而不是"数字"
推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有